//
//  Problem1790.swift
//  TestProject
//
//  Created by 毕武侠 on 2021/3/28.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 1790. 仅执行一次字符串交换能否使两个字符串相等 【字符对比】
 给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下：选出某个字符串中的两个下标（不必不同），并交换这两个下标所对应的字符。

 如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等，返回 true ；否则，返回 false 。

 示例 1：
     输入：s1 = "bank", s2 = "kanb"
     输出：true
     解释：例如，交换 s2 中的第一个和最后一个字符可以得到 "bank"
 示例 2：
     输入：s1 = "attack", s2 = "defend"
     输出：false
     解释：一次字符串交换无法使两个字符串相等
 示例 3：
     输入：s1 = "kelb", s2 = "kelb"
     输出：true
     解释：两个字符串已经相等，所以不需要进行字符串交换
 示例 4：
     输入：s1 = "abcd", s2 = "dcba"
     输出：false
 提示：
     1 <= s1.length, s2.length <= 100
     s1.length == s2.length
     s1 和 s2 仅由小写英文字母组成
 */
@objcMembers class Problem1790: NSObject {
    func solution() {
//        print(areAlmostEqual("bank", "kanb"))
//        print(areAlmostEqual("attack", "defend"))
//        print(areAlmostEqual("kelb", "kelb"))
//        print(areAlmostEqual("abcd", "dcba"))
        
        print(areAlmostEqual("a", "b"))
        print(areAlmostEqual("ab", "bb"))
        print(areAlmostEqual("ab", "ba"))
        print(areAlmostEqual("aa", "ab"))
        print(areAlmostEqual("aa", "aa"))
    }
    
    /*
     1: 找到第一个不相等的字符，记录下表firstI
     2: 找到第二个不相同的字符，判读2个字符是否可以互换
     */
    func areAlmostEqual(_ s1: String, _ s2: String) -> Bool {
        var firstC: Character? = nil
        var secondC: Character? = nil
        let charts = Array(s1)
        for (i, c) in s2.enumerated() {
            if c != charts[i] {
                if firstC == nil {
                    firstC = c
                    secondC = charts[i]
                } else if firstC == charts[i] && secondC == c {
                    firstC = "?"
                    secondC = "?"
                } else {
                    return false
                }
            }
        }
        
        return firstC == nil || firstC == "?"
    }
}
